package com.company.command_chain.CommandChain.command_name;

import com.company.command_chain.CommandChain.CommandVO;



/**
 * @author cbf4Life cbf4life@126.com
 * I'm glad to share my knowledge with you all.
 * 充当Handler
 * 在这个包当中，本类CommandName作为Handle类，即基类，其他df和ls包当中的类作为命令处理类，os包中的类作为处理操作具体的执行类
 * df额ls包中的类继承这个CommandName，df和ls包中的类使用os包中的类处理自身的命令。
 */
public abstract class CommandName {
	
	private CommandName nextOperator;

	public final String handleMessage(CommandVO vo){
		//处理结果
		String result = "";
		
		//判断是否是自己处理的参数
		//this.getOperateParam()在每一个子类当中有具体的实现，返回子类的一个标识。
		//这里通过获得命令的参数来判断，比如"ls -l"，其中的参数是"l"，vo.getParam()返回"l"，然后this.getOperateParam()返回一个"l"、"a"或者""（参考AbstractLS的定义）
		if(vo.getParam().size() == 0 || vo.getParam().contains(this.getOperateParam())){
			result = this.echo(vo);
		}else{  //不该本级处理
			if(this.nextOperator !=null){  //如果链中还有下一个对象，则将请求向下传递
				result = this.nextOperator.handleMessage(vo);
			}else{  //如果链中没有下一个对象，则返回无法处理请求的提示
				result = "Command can not execute!";
			}
		}

		return result;
	}
	

	//设置剩余参数谁来处理
	public void setNext(CommandName _operator){
		this.nextOperator = _operator;
	}

	//每个处理者都要处理一个后缀参数
	protected abstract String getOperateParam();
	
	//每个处理者都必须实现处理任务
	protected abstract String echo(CommandVO vo);
	
}
